//
//  HMStatusDAL.swift
//  Weibo
//
//  Created by itteacher on 2017/8/4.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit
//  7天前的时间
private let MaxTime: TimeInterval = -7 * 24 * 3600

//  微博数据库的访问层， 用于缓存微博数据和查询本地数据等操作
class HMStatusDAL: NSObject {

    /*
        微博缓存数据的流程
        1. 判断本地是否有缓存数据
        2. 如果本地有缓存数据直接使用本地的缓存数据
        3. 如果本地没有缓存数据那么直接从网络加载微博数据
        4. 微博数据请求成功把微博数据缓存到本地
        5. 数据缓存成功以后把网络加载的数据展示出来
     */
    //  maxId上拉加载使用的微博id
    //  sinceId下拉刷新使用的微博id
    //  检查本地缓存数据
    class func checkCacheData(maxId: Int64, sinceId: Int64) -> [[String: Any]]{
        //  SELECT * FROM t_statuses where id < 4137045527923850 and userid = 5826086647 order by id desc limit 20
        //  准备sql
        var sql = "select * from t_statuses"
        if maxId > 0 {
            //  上拉加载的本地查询
            sql += " where id < \(maxId)"
            
        } else {
            //  下拉刷新或者第一次获取微博数据的本地查询
            sql += " where id > \(sinceId)"
        }
        //  获取登录用户的id
        let userid = HMUserAccountViewModel.sharedViewModel.userAccount?.uid
        sql += " and userid = \(userid!)"
        //  设置微博是降序和最多显示20条
        sql += " order by id desc limit 20"
        //  执行sql
        let dicArray = HMSqliteManager.sharedManager.selectDicArray(sql: sql)
        //  存储每一条微博数据
        var tempArray = [[String: Any]]()
        //  遍历结果集获取微博的二进制数据
        for dic in dicArray {
            //  获取微博内容的二进制数据
            let statusData = dic["status"] as! Data
            //  把二进制数据反序列化字典
            let statusDic = try! JSONSerialization.jsonObject(with: statusData, options: []) as! [String: Any]
            tempArray.append(statusDic)
        }
        //  返回查询后的微博数据
        return tempArray
        
        
    }
    
    
    //  缓存微博数据
    class func cacheData(statusDicArray: [[String: Any]]) {
        //  准备sql 
        let sql = "insert into t_statuses(id, status, userid) values(?, ?, ?);"
        //  获取用户id
        let userid = HMUserAccountViewModel.sharedViewModel.userAccount?.uid
        //  开启事物，保证数据的完整型
        HMSqliteManager.sharedManager.queue.inTransaction { (db, rollBack) in
            //  遍历字典数组一次往表里面插入数据
            for statusDic in statusDicArray {
                //  微博id
                let id = statusDic["id"] as! Int64
                //  微博内容（微博的二进制数据）
                let statusDicData = try! JSONSerialization.data(withJSONObject: statusDic, options: [])
                //  执行sql
                let result = db.executeUpdate(sql, withArgumentsIn: [id, statusDicData, userid!])
                if result == false {
                    print("插入异常回滚数据")
                    //  pointee 表示获取指针引用的实例
                    rollBack.pointee = true
                    break;
                }
            }
        }
    
    }
    
    //  清除缓存数据
    class func clearCacheData() {
        //  准备sql
        let sql = "delete  from t_statuses where time < ?;"
        let dt = DateFormatter()
        dt.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //  获取删除缓存数据最大时间字符串
        let maxTimeStr = dt.string(from: Date().addingTimeInterval(MaxTime))
        //  执行sql
        HMSqliteManager.sharedManager.queue.inDatabase { (db) in
            let result = db.executeUpdate(sql, withArgumentsIn: [maxTimeStr])
            if result {
                print("缓存数据删除成功， 影响了\(db.changes)")
            } else {
                print("缓存数据删除失败")
            }
        }
    }
    
    
}
